package br.com.quad.dao;

import java.util.List;

import br.com.quad.bean.Acessorio;
import br.com.quad.bean.Imagem;
import br.com.quad.bean.Veiculo;
import br.com.quad.bean.VeiculoInformacaoAdicional;


public class VeiculoDAOHibernate implements VeiculoDAO {
	HibernateDAOFactory hibernateDAOFactory = null;
	HibernateDAO<Veiculo> hibernateDAO = null;

	public VeiculoDAOHibernate(){
		hibernateDAOFactory = new HibernateDAOFactory();
		hibernateDAO = hibernateDAOFactory.getVeiculoDAO();
	}

	@Override
	public Veiculo inserir(Veiculo veiculo) throws Exception {
	
		try {
			veiculo = (Veiculo) hibernateDAO.add(veiculo);
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} 
		return veiculo;
	}

	@Override
	public boolean alterar(Veiculo veiculo) throws Exception {
		boolean ok = false;
		
		try {
			hibernateDAO.update(veiculo);
			ok = true;
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} 
		return ok;
	}

	@Override
	public boolean isExclusaoLiberada(Veiculo veiculo) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean excluir(Veiculo veiculo) throws Exception {
		boolean ok = false;

		try {
			hibernateDAO.remove(veiculo);
			ok = true;
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}

		return ok;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Veiculo> getSelecionar(int codigoTipoVeiculo,int codigoFabricante,int codigoModelo,int codigoCambio, int codigoCor,int codigoCombustivel,int ativo,String nomeCliente,String cPF_CNPJ) {
		String 	sql = "FROM Veiculo as v WHERE codigoVeiculo <> 0";
		
		if ((codigoTipoVeiculo != 0)) {
			sql += " AND v.modelo.tipoVeiculo.codigoTipoVeiculo = " + codigoTipoVeiculo + " ";  
		}
		
		if ((codigoFabricante != 0)) {
			sql += " AND v.modelo.fabricante.codigoFabricante = " + codigoFabricante + " ";  
		}

		if ((codigoModelo != 0)) {
			sql += " AND v.modelo.codigoModelo = " + codigoModelo + " ";  
		}
		
		if ((codigoCambio != 0)) {
			sql += " AND v.cambio.codigoCambio = " + codigoCambio + " ";  
		}
		
		if ((codigoCor != 0)) {
			sql += " AND v.cor.codigoCor = " + codigoCor + " ";  
		}
		
		if ((codigoCombustivel != 0)) {
			sql += " AND v.codigoCombustivel = " + codigoCombustivel + " ";  
		}		
		
		if ((ativo != 0)) {
			sql += " AND v.ativo = " + ativo + " ";  
		}
		
		if (!(nomeCliente.isEmpty() )) {
			sql += " AND v.cliente.nome like '" + nomeCliente +"%'  ";  
		}
		if (!(cPF_CNPJ.isEmpty()) ) {
			sql += " AND v.cliente.CPF_CNPJ = '" + cPF_CNPJ + "' ";  
		}

		sql += " ORDER BY v.modelo.descricao";		
 
		List<Veiculo> lista = hibernateDAO.getSession().createQuery(sql).list();

		return lista;
	}

	@Override
	public Veiculo getVeiculo(int codigoVeiculo) {	

		String 	sql = "FROM Veiculo as v WHERE v.codigoVeiculo = "+codigoVeiculo;

		//Veiculo veiculo = (Veiculo) hibernateDAO.getSession().createQuery(sql).uniqueResult();

		return (Veiculo) hibernateDAO.getSession().createQuery(sql).uniqueResult();
		//return hibernateDAO.get(codigoVeiculo);
	}

	@Override
	public List<Veiculo> getListarTodos() {
		return hibernateDAO.listAll();
	}

	@Override
	public boolean isExiste(Veiculo veiculo) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void inicialize(Veiculo veiculo){
		if(veiculo == null){
			return;
		}
		Veiculo v = DAOFactory.getVeiculoDAO().getVeiculo(veiculo.getCodigoVeiculo());

		/*
		// ACESSORIOS
		for (Acessorio acessorio : v.getAcessorios()) {
			for (TipoVeiculo tipoVeiculo: acessorio.getTipoVeiculos()) {
				for (InformacaoAdicional informacaoAdicional : tipoVeiculo.getInformacoes()) {
					// OLHAR O TIPOVEICULO de informacaoAdicional
				}
				for (Acessorio acessorio2 : tipoVeiculo.getAcessorios()){
					//OLHAR TIPO VEICULO DE ACESSORIO
				}
			}
			acessorio.setTipoVeiculos(acessorio.getTipoVeiculos());
		}
		*/

		for (Acessorio acessorio : v.getAcessorios()) {
		}
		veiculo.setAcessorios(v.getAcessorios());

		//  veiculoInformacaoAdicionais
		for (VeiculoInformacaoAdicional veiculoInformacaoAdicional : v.getVeiculoInformacaoAdicionais()) {
		}
		veiculo.setVeiculoInformacaoAdicionais(v.getVeiculoInformacaoAdicionais());
		
		// IMAGEM
		for (Imagem imagem: v.getImagens()){
		}
		veiculo.setImagens(v.getImagens());
	}
}
